#include "rule.h"
#include <algorithm>

/**
 * @brief 默认构造函数
 * 
 * 创建一个空的规则对象
 */
Rule::Rule() {}

/**
 * @brief 带参数的构造函数
 * @param name 规则名称
 * @param conditions 条件列表
 * @param conclusion 结论
 * 
 * 创建一个具有指定名称、条件和结论的规则对象
 */
Rule::Rule(const QString &name, const QStringList &conditions, const QString &conclusion)
    : m_name(name), m_conditions(conditions), m_conclusion(conclusion) {}

/**
 * @brief 获取规则名称
 * @return 规则名称
 */
QString Rule::getName() const
{
    return m_name;
}

/**
 * @brief 获取条件列表
 * @return 条件列表
 */
QStringList Rule::getConditions() const
{
    return m_conditions;
}

/**
 * @brief 获取结论
 * @return 结论
 */
QString Rule::getConclusion() const
{
    return m_conclusion;
}

/**
 * @brief 检查规则是否匹配给定的事实
 * @param facts 事实列表
 * @return 如果规则的所有条件都在事实列表中，则返回true，否则返回false
 * 
 * 该方法用于推理过程中判断规则是否可以被应用
 */
bool Rule::isMatched(const QStringList &facts) const
{
    // 检查所有条件是否都在事实中
    for (const QString &condition : m_conditions) {
        if (!facts.contains(condition)) {
            return false;
        }
    }
    return true;
}